package Reflect.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilterInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author: zcw
 * @version: 1.0
 * 快速入门介绍
 */
@SuppressWarnings ({"all"})
public class Main {
        public static  void fg(){
            System.out.println ("============================================");
        }
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

        //1.传统方式
        Cat cat = new Cat();
        cat.hi ();
        fg ();
        //2.使用Properties 读写配置文件 行不通 注意区别字符串和类
        Properties properties = new Properties ();
        properties.load (new FileInputStream ("src\\Reflect\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString ();
        String method = properties.get("method").toString ();
        System.out.println ("classfullpath = " + classfullpath + " method = " + method);
        fg ();
        //3利用反射机制
            //（1）加载类，返回Class类型的对象
        Class cls = Class.forName (classfullpath);
            //(2)通过 cls 得到你加载的类 Reflect.Test.Cat 的对象实例
        Object o = cls.newInstance ();
            //(3)通过 cls 得到你加载的类 Reflect.Test.Cat 的 method 的方法对象
                //即： 在反射中，可以把方法视为对象（万物皆对象）
        Method method1 = cls.getMethod (method);
            //(4)通过 metho1 调用方法：即通过方法对象来实现调用方法
        method1.invoke (o);
    }
}
